﻿' BasecampVB - http://www.tidbitsandtangents.com
' Copyright (c) 2009
' by Rusty S. Swayne
'
' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
' of the Software.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
' INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
' DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
' SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
' WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Imports TnT.BasecampVB.DAL

Namespace BLL

    Public Class Category
        Inherits BasecampBase

        ''' <summary>
        ''' Constructor
        ''' </summary>
        Public Sub New( _
            ByVal category_id As Integer, _
            ByVal project_id As Integer, _
            ByVal name As String, _
            ByVal elements_count As Integer, _
            ByVal type As String)

            Me.category_id = category_id
            Me.project_id = project_id
            Me.name = name
            Me.elements_count = elements_count
            Me.type = type

        End Sub

        ''' <summary>
        ''' Returns a Category from Basecamp API
        ''' </summary>
        Public Shared Function GetCategory(ByVal category_id As Integer) As Category
            Return GetCategoryFromCategoryDetails(BasecampProvider.API.GetCategory(category_id))
        End Function

        ''' <summary>
        ''' Returns List(Of Category) for a given project with an optional filter
        ''' </summary>
        Public Shared Function GetCategories(ByVal project_id As Integer, ByVal type As CategoryType) As List(Of Category)
            Dim filter As String = type.ToString
            If String.Equals(filter, "all") Then filter = String.Empty
            Return GetCategoryListFromCategoryDetailsCollection(BasecampProvider.API.GetCategories(project_id, filter))
        End Function

        ''' <summary>
        ''' Creates a Basecamp category in a given project in Basecamp
        ''' </summary>
        Public Shared Function CreateCategory(ByVal project_id As Integer, ByVal type As CategoryType, ByVal name As String) As Integer
            Dim t As String = "post"
            If type = CategoryType.attachment Then t = "attachment"
            Return BasecampProvider.API.CreateCategory(project_id, t, name)
        End Function

        ''' <summary>
        ''' Updates a Basecamp category in a given project in Basecamp
        ''' </summary>
        Public Shared Function UpdateCategory(ByVal category_id As Integer, ByVal name As String) As Boolean
            Return BasecampProvider.API.UpdateCategory(category_id, name)
        End Function

        ''' <summary>
        ''' Updates a Basecamp category in a given project in Basecamp
        ''' </summary>
        Public Function Update() As Boolean
            Return UpdateCategory(Me.category_id, Me.name)
        End Function

        ''' <summary>
        ''' Deletes a Basecamp category in a given project in Basecamp
        ''' </summary>
        Public Shared Function DeleteCategory(ByVal category_id As Integer) As Boolean
            Return BasecampProvider.API.DeleteCategory(category_id)
        End Function

        ''' <summary>
        ''' Deletes a Basecamp category in a given project in Basecamp
        ''' </summary>
        Public Function Delete()
            Dim ret As Boolean = DeleteCategory(Me.category_id)
            Me.category_id = 0
            Return ret
        End Function

#Region "Private Utility Methods"

        ''' <summary>
        ''' Helper Function to create a List(Of Category) from List(Of CategoryDetails)
        ''' </summary>
        Private Shared Function GetCategoryListFromCategoryDetailsCollection(ByVal recordset As List(Of CategoryDetails)) As List(Of Category)
            Dim categories As New List(Of Category)
            Dim record As CategoryDetails = Nothing
            For Each record In recordset
                categories.Add(GetCategoryFromCategoryDetails(record))
            Next
            Return categories
        End Function

        ''' <summary>
        ''' Helper Function to create a Category from CategoryDetails
        ''' </summary>
        Private Shared Function GetCategoryFromCategoryDetails(ByVal record As CategoryDetails) As Category
            Return New Category(record.category_id, record.project_id, record.name, record.elements_count, record.type)
        End Function

#End Region

#Region "Properties"

        Private _category_id As Integer
        Public Property category_id() As Integer
            Get
                Return _category_id
            End Get
            Set(ByVal value As Integer)
                _category_id = value
            End Set
        End Property

        Private _project_id As Integer
        Public Property project_id() As Integer
            Get
                Return _project_id
            End Get
            Set(ByVal value As Integer)
                _project_id = value
            End Set
        End Property


        Private _name As String
        Public Property name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property


        Private _elements_count As Integer
        Public Property elements_count() As Integer
            Get
                Return _elements_count
            End Get
            Set(ByVal value As Integer)
                _elements_count = value
            End Set
        End Property

        Private _type As String
        Public Property type() As String
            Get
                Return _type
            End Get
            Set(ByVal value As String)
                _type = value
            End Set
        End Property





#End Region

    End Class

End Namespace
